From 04c6c748ca887020c6994687eae990c3e0b7d288 Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Fri, 19 Feb 2016 13:34:27 -0800 Subject: [PATCH] Remove the ability to list packages in PackageSet If we download lazily, that's excessively wasteful! --- src/cargo/core/package.rs | 13 ++++++++++--- src/cargo/ops/cargo_clean.rs | 2 +- src/cargo/ops/cargo_compile.rs | 4 +--- src/cargo/ops/cargo_output_metadata.rs | 7 ++++++- src/cargo/ops/cargo_rustc/context.rs | 4 +--- src/cargo/ops/cargo_rustc/mod.rs | 4 +--- 6 files changed, 20 insertions(+), 14 deletions(-) diff --git a/src/cargo/core/package.rs b/src/cargo/core/package.rs index 4df81b162..e671a15a6 100644 --- a/src/cargo/core/package.rs +++ b/src/cargo/core/package.rs @@ -1,8 +1,9 @@ use std::collections::HashMap; use std::fmt; use std::hash; -use std::slice; +use std::iter; use std::path::{Path, PathBuf}; +use std::slice; use semver::Version; use core::{Dependency, Manifest, PackageId, SourceId, Target}; @@ -132,8 +133,14 @@ impl<'cfg> PackageSet<'cfg> { } } - pub fn packages(&self) -> slice::Iter { - self.packages.iter() + pub fn package_ids(&self) -> iter::Map, + fn(&Package) -> &PackageId> { + let f = Package::package_id as fn(&Package) -> &PackageId; + self.packages.iter().map(f) + } + + pub fn get(&self, id: &PackageId) -> &Package { + self.packages.iter().find(|pkg| pkg.package_id() == id).unwrap() } pub fn sources(&self) -> &SourceMap<'cfg> { diff --git a/src/cargo/ops/cargo_clean.rs b/src/cargo/ops/cargo_clean.rs index 3da7b5e4b..135943827 100644 --- a/src/cargo/ops/cargo_clean.rs +++ b/src/cargo/ops/cargo_clean.rs @@ -42,7 +42,7 @@ pub fn clean(manifest_path: &Path, opts: &CleanOptions) -> CargoResult<()> { for spec in opts.spec { // Translate the spec to a Package let pkgid = try!(resolve.query(spec)); - let pkg = packages.packages().find(|p| p.package_id() == pkgid).unwrap(); + let pkg = packages.get(&pkgid); // And finally, clean everything out! for target in pkg.targets() { diff --git a/src/cargo/ops/cargo_compile.rs b/src/cargo/ops/cargo_compile.rs index 1b7a5b0ea..3286db42f 100644 --- a/src/cargo/ops/cargo_compile.rs +++ b/src/cargo/ops/cargo_compile.rs @@ -180,9 +180,7 @@ pub fn compile_pkg<'a>(root_package: &Package, invalid_spec.join(", ")) } - let to_builds = packages.packages() - .filter(|p| pkgids.contains(&p.package_id())) - .collect::>(); + let to_builds = pkgids.iter().map(|id| packages.get(id)).collect::>(); let mut general_targets = Vec::new(); let mut package_targets = Vec::new(); diff --git a/src/cargo/ops/cargo_output_metadata.rs b/src/cargo/ops/cargo_output_metadata.rs index bcc9bc70a..7902ea3e9 100644 --- a/src/cargo/ops/cargo_output_metadata.rs +++ b/src/cargo/ops/cargo_output_metadata.rs @@ -51,8 +51,13 @@ fn metadata_full(opt: OutputMetadataOptions, config: &Config) -> CargoResult Context<'a, 'cfg> { /// Gets a package for the given package id. pub fn get_package(&self, id: &PackageId) -> &'a Package { - self.packages.packages() - .find(|pkg| id == pkg.package_id()) - .expect("Should have found package") + self.packages.get(id) } /// Get the user-specified linker for a particular host or target diff --git a/src/cargo/ops/cargo_rustc/mod.rs b/src/cargo/ops/cargo_rustc/mod.rs index 8268eb50d..593f86870 100644 --- a/src/cargo/ops/cargo_rustc/mod.rs +++ b/src/cargo/ops/cargo_rustc/mod.rs @@ -79,9 +79,7 @@ pub fn compile_targets<'a, 'cfg: 'a>(pkg_targets: &'a PackagesToBuild<'a>, }).collect::>(); let dest = if build_config.release {"release"} else {"debug"}; - let root = packages.packages().find(|p| { - p.package_id() == resolve.root() - }).unwrap(); + let root = packages.get(resolve.root()); let host_layout = Layout::new(config, root, None, &dest); let target_layout = build_config.requested_target.as_ref().map(|target| { layout::Layout::new(config, root, Some(&target), &dest) -- 2.30.2